home *** CD-ROM | disk | FTP | other *** search
/ SuperView Productivity Suite 2 / SuperView Productivity Suite 2.iso / BONUS / PROGS / ModeP.lha / ModeP / ModeP.c < prev    next >
C/C++ Source or Header  |  1997-02-18  |  8KB  |  266 lines

  1. /************************************************************************
  2.  *                                                                      *
  3.  *  ModeP - replace graphic.library's BestModeID()                      *
  4.  *                                                                      *
  5.  *  written by Andreas R. Kleinert                                      *
  6.  *  Andreas_Kleinert@t-online.de                                        *
  7.  *                                                                      *
  8.  *  No Assembler - 100 percent C                                        *
  9.  *                                                                      *
  10.  * V1.0 :                                                               *
  11.  *        - first release                                               *
  12.  *                                                                      *
  13.  ************************************************************************/
  14.  
  15. #define __USE_SYSBASE
  16.  
  17. #include <exec/memory.h>
  18. #include <intuition/intuitionbase.h>
  19. #include <libraries/gadtools.h>
  20. #include <graphics/gfxbase.h>
  21.  
  22. #include <cybergraphics/cybergraphics.h>
  23.  
  24. #include <vilintuisup.h>
  25. #include <vilintuisup/ScreenMode.h>
  26.  
  27. #include <string.h>
  28. #include <stdio.h>
  29.  
  30. #include <proto/exec.h>
  31. #include <proto/dos.h>
  32. #include <proto/intuition.h>
  33. #include <proto/graphics.h>
  34. #include <proto/utility.h>
  35. #include <proto/cybergraphics.h>
  36. #include <vilintuisup/vilintuisup_protos.h>
  37. #include <vilintuisup/vilintuisup_pragmas.h>
  38.  
  39. #define N (NULL)
  40.  
  41. struct IntuitionBase *IntuitionBase = N;
  42. struct GfxBase       *GfxBase       = N;
  43. struct Library       *CyberGfxBase  = N;
  44. struct Library       *VilIntuiBase  = N;
  45.  
  46.  
  47. APTR __far NewBestModeVec;
  48. long __far __asm (*OrigBestModeVec)(register __a0 struct TagItem *tags_a0,
  49.                                     register __a6 struct GfxBase *GfxBase_a6);
  50.  
  51.  
  52. ULONG __saveds __asm NewBestMode(register __a0 struct TagItem *tags_a0,
  53.                                  register __a6 struct GfxBase *GfxBase_a6)
  54. {
  55.  struct TagItem *tags    = tags_a0;
  56.  struct GfxBase *GfxBase = GfxBase_a6;
  57.  ULONG mode_id = N, old = FALSE;
  58.  
  59.  
  60.  if(FindTagItem(BIDTAG_DIPFMustHave,    tags)) old = TRUE;
  61.  if(FindTagItem(BIDTAG_DIPFMustNotHave, tags)) old = TRUE;
  62.  if(FindTagItem(BIDTAG_ViewPort,        tags)) old = TRUE;
  63.  if(FindTagItem(BIDTAG_MonitorID,       tags)) old = TRUE;
  64.  if(FindTagItem(BIDTAG_SourceID,        tags)) old = TRUE;
  65.  if(FindTagItem(BIDTAG_RedBits,         tags)) old = TRUE;
  66.  if(FindTagItem(BIDTAG_BlueBits,        tags)) old = TRUE;
  67.  if(FindTagItem(BIDTAG_GreenBits,       tags)) old = TRUE;
  68.  
  69.  if(old)
  70.   {
  71.    mode_id = OrigBestModeVec(tags, GfxBase);
  72.   }else
  73.   {
  74.    struct TagItem *tag;
  75.  
  76.    ULONG width, height, depth;
  77.  
  78.    tag = FindTagItem(BIDTAG_NominalWidth, tags);
  79.    if(tag)
  80.     {
  81.      width = tag->ti_Data;
  82.     }else
  83.     {
  84.      tag = FindTagItem(BIDTAG_DesiredWidth, tags);
  85.      if(tag) width = tag->ti_Data;
  86.       else return(INVALID_ID);
  87.     }
  88.  
  89.    tag = FindTagItem(BIDTAG_NominalHeight, tags);
  90.    if(tag)
  91.     {
  92.      height = tag->ti_Data;
  93.     }else
  94.     {
  95.      tag = FindTagItem(BIDTAG_DesiredHeight, tags);
  96.      if(tag) height = tag->ti_Data;
  97.       else return(INVALID_ID);
  98.     }
  99.  
  100.    tag = FindTagItem(BIDTAG_Depth, tags);
  101.    if(tag) depth = tag->ti_Data;
  102.     else   depth = 1;
  103.  
  104.    if(CyberGfxBase)
  105.     {
  106.      struct TagItem modetags [4];
  107.  
  108.      modetags[0].ti_Tag  = CYBRBIDTG_Depth;
  109.      modetags[1].ti_Tag  = CYBRBIDTG_NominalWidth;
  110.      modetags[2].ti_Tag  = CYBRBIDTG_NominalHeight;
  111.      modetags[3].ti_Tag  = TAG_END;
  112.  
  113.      if(depth < 8) modetags[0].ti_Data = 8;
  114.       else         modetags[0].ti_Data = depth;
  115.                    modetags[1].ti_Data = width;
  116.                    modetags[2].ti_Data = height;
  117.                    modetags[3].ti_Data = N;
  118.  
  119.      mode_id = BestCModeIDTagList(&modetags[0]);
  120.     }else
  121.     {
  122.      if(VilIntuiBase)
  123.       {
  124.        struct TagItem modetags [4];
  125.  
  126.        modetags[0].ti_Tag  = TAVIS_SCREEN_WIDTH;
  127.        modetags[1].ti_Tag  = TAVIS_SCREEN_HEIGHT;
  128.        modetags[2].ti_Tag  = TAVIS_SCREEN_DEPTH;
  129.        modetags[3].ti_Tag  = TAG_END;
  130.  
  131.                      modetags[0].ti_Data = width;
  132.                      modetags[1].ti_Data = height;
  133.        if(depth < 8) modetags[2].ti_Data = 8;
  134.         else         modetags[2].ti_Data = depth;
  135.                      modetags[3].ti_Data = N;
  136.  
  137.        mode_id = VillageBestModeID(&modetags[0]);
  138.       }
  139.     }
  140.  
  141.    if(   (mode_id == 0L) || (mode_id == INVALID_ID)
  142.       || (ModeNotAvailable(mode_id))                )
  143.     {
  144.      /* Uses OverScan values for checking.         */
  145.      /* Assumes an ECS-System, but checks for AGA. */
  146.  
  147.      /* with AGA, all resolutions work upto 8 Bit, so check */
  148.      if(GfxBase->ChipRevBits0 & (1<<GFXB_AA_ALICE) ) depth = 1;
  149.  
  150.           if(width > 724 && depth < 3)   mode_id = SUPER_KEY;
  151.      else if(width > 362 && depth < 5)   mode_id = HIRES_KEY;
  152.      else                                mode_id = LORES_KEY;
  153.  
  154.      if(!ModeNotAvailable(mode_id | PAL_MONITOR_ID))    /* for PAL  Systems */
  155.       {
  156.        if(height > 283) mode_id |= LACE;
  157.  
  158.        mode_id |= PAL_MONITOR_ID;
  159.       }else
  160.       {
  161.        if(!ModeNotAvailable(mode_id | NTSC_MONITOR_ID)) /* for NTSC Systems */
  162.         {
  163.          if(height > 241) mode_id |= LACE;
  164.  
  165.          mode_id |= NTSC_MONITOR_ID;
  166.         }
  167.       }
  168.     }
  169.   }
  170.  
  171.  return(mode_id);
  172. }
  173.  
  174. /* *************************************************** */
  175. /* *                                                 * */
  176. /* * Compiler Stuff for BackgroundIO                 * */
  177. /* *                                                 * */
  178. /* *************************************************** */
  179.  
  180. long  __stack        = 8192;
  181. char *__procname     = "ModeP";
  182. long  __priority     = 1;
  183. long  __BackGroundIO = 1;           /* TRUE : We DO BackGroundIO !     */
  184.  
  185. extern BPTR _Backstdout;            /* NULL, if started from Workbench */
  186.  
  187. void __regargs __chkabort(void) { }
  188. void __regargs _CXBRK(void)     { }
  189.  
  190. char vertext [] = "\0$VER: ModeP V1.0";
  191.  
  192.  
  193. typedef unsigned long (*FUNCCAST)();
  194.  
  195. long main(long argc, char **argv)
  196. {
  197.  long retval = 0;
  198.  
  199.  APTR task;
  200.  
  201.  Forbid();
  202.  task = FindTask(N);
  203.  Permit();
  204.  
  205.  if(task) SetTaskPri(task, __priority);
  206.  
  207.  
  208.  CyberGfxBase = (APTR) OpenLibrary("cybergraphics.library", 40);
  209.  VilIntuiBase = (APTR) OpenLibrary("vilintuisup.library", 1);
  210.  
  211.  
  212.  IntuitionBase = (APTR) OpenLibrary("intuition.library", 39);
  213.  if(IntuitionBase)
  214.   {
  215.    UtilityBase = (APTR) OpenLibrary("utility.library", 37);
  216.    if(UtilityBase)
  217.     {
  218.      GfxBase = (APTR) OpenLibrary("graphics.library", 39);
  219.      if(GfxBase)
  220.       {
  221.        OrigBestModeVec = (long (* __asm )(register __a0 struct TagItem *tags_a0,
  222.                                           register __a6 struct GfxBase *GfxBase_a6)) SetFunction((APTR)GfxBase, -0x41a, (APTR)NewBestMode);
  223.        if(OrigBestModeVec)
  224.         {
  225.          if(task) SetTaskPri(task, -10);
  226.          Wait(SIGBREAKF_CTRL_C);
  227.          if(task) SetTaskPri(task, 1);
  228.  
  229.          NewBestModeVec= (APTR) SetFunction((APTR)GfxBase, -0x41a, (APTR)OrigBestModeVec);
  230.  
  231.          if(NewBestModeVec!=NewBestMode)
  232.           {
  233.            ULONG idcmp = N;
  234.            struct EasyStruct estr;
  235.  
  236.            estr.es_StructSize   = sizeof(struct EasyStruct);
  237.            estr.es_Flags        = N;
  238.            estr.es_Title        = "ModeP Request";
  239.            estr.es_TextFormat   = "Error while removing from system !\n"
  240.                                   "There were more patches !"
  241.                                   "Do a reset soon !";
  242.            estr.es_GadgetFormat = "Ok";
  243.  
  244.            EasyRequestArgs(N, &estr, (ULONG *) &idcmp, N);
  245.           }
  246.  
  247.          CloseLibrary((struct Library *) GfxBase);
  248.       
  249.         }else retval = 20;
  250.  
  251.       }else retval = 20;
  252.  
  253.      CloseLibrary((struct Library *) UtilityBase);
  254.  
  255.     }else retval = 20;
  256.  
  257.    CloseLibrary((struct Library *) IntuitionBase);
  258.  
  259.   }else retval = 20;
  260.  
  261.  if(VilIntuiBase) CloseLibrary((struct Library *) VilIntuiBase);
  262.  if(CyberGfxBase) CloseLibrary((struct Library *) CyberGfxBase);
  263.  
  264.  return(retval);
  265. }
  266.